﻿using System;
using System.Collections.Generic;
using System.Text;

namespace Webcam_Filter
{
    public class PixelatorFilter : Filter
    {
        protected override void runfilter(byte[] rgbValues, int hoogte, int breedte, string[] args)
        {
            int pixelGrootte = 0;
            if (args.Length ==1 && args[0] != null)
                pixelGrootte = int.Parse(args[0]);
            if (pixelGrootte <= 0)
                pixelGrootte = 1;

            int breedteARGB = breedte*4;
            int pixelGrootteARGB = pixelGrootte * 4;
            int aantalPixelsAfbeelding = hoogte * breedteARGB;

            for(int h = 0; h < aantalPixelsAfbeelding; h += (pixelGrootte * breedteARGB))
            {
                for (int b = h; b < ((h + breedteARGB)); b += pixelGrootteARGB)
                {
                    int gemiddeldeWaardeA = 0;
                    int gemiddeldeWaardeB = 0;
                    int gemiddeldeWaardeG = 0;
                    int gemiddeldeWaardeR = 0;

                    int grensBytesHoogte = b + (pixelGrootte * breedteARGB);
                    if (grensBytesHoogte > hoogte * breedteARGB)
                        grensBytesHoogte = hoogte * breedteARGB;


                    int totaalBytes = 0;


                    for (int hklein = b; hklein < grensBytesHoogte; hklein += breedteARGB)
                    {
                        int grensBytesBreedte = hklein + pixelGrootteARGB;
                        if (grensBytesBreedte > aantalPixelsAfbeelding)
                            grensBytesBreedte = aantalPixelsAfbeelding;

                        for (int bklein = hklein; bklein < grensBytesBreedte; bklein += 4)
                        {
                            totaalBytes++;
                            gemiddeldeWaardeA += rgbValues[bklein];
                            gemiddeldeWaardeB += rgbValues[bklein + 1];
                            gemiddeldeWaardeG += rgbValues[bklein + 2];
                            gemiddeldeWaardeR += rgbValues[bklein + 3];
                        }
                    }

                    gemiddeldeWaardeA /= totaalBytes;
                    gemiddeldeWaardeB /= totaalBytes;
                    gemiddeldeWaardeG /= totaalBytes;
                    gemiddeldeWaardeR /= totaalBytes;

                    for (int hklein = b; hklein < grensBytesHoogte; hklein += breedteARGB)
                    {
                        int grensBytesBreedte = hklein + pixelGrootteARGB;
                        if (grensBytesBreedte > aantalPixelsAfbeelding)
                            grensBytesBreedte = aantalPixelsAfbeelding;

                        for (int bklein = hklein; bklein < grensBytesBreedte; bklein += 4)
                        {
                            rgbValues[bklein] = (byte)gemiddeldeWaardeA;
                            rgbValues[bklein + 1] = (byte)gemiddeldeWaardeB;
                            rgbValues[bklein + 2] = (byte)gemiddeldeWaardeG;
                            rgbValues[bklein + 3] = (byte)gemiddeldeWaardeR;

                        }
                    }

                }

             }

        }
    }
}













        